// 官方
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n, q; // n: 初始字符串长度(未使用), q: 操作数量
  cin >> n >> q;

  // 存储操作历史
  vector<int> op(q), position(q);    // 操作类型和位置
  vector<string> appended_string(q); // 追加的字符串(仅操作2使用)

  // 读取所有操作
  for (int i = 0; i < q; i++) {
    cin >> op[i] >> position[i];
    if (op[i] == 2) { // 如果是追加操作
      cin >> appended_string[i];
      reverse(appended_string[i].begin(), appended_string[i].end()); // 预先反转
    }
  }

  string result;       // 最终结果
  int current_pos = 0; // 当前处理位置

  // 逆向处理操作
  for (int t = q - 1; t >= 0; t--) {
    switch (op[t]) {
    case 1: // 操作1: 重置位置
      if (current_pos == position[t]) {
        current_pos = 0;
      }
      break;

    case 2: // 操作2: 追加字符串
      if (current_pos == position[t]) {
        result += appended_string[t];
      }
      break;

    case 3: // 操作3: 设置位置
      if (current_pos == 0) {
        current_pos = position[t];
      }
      break;
    }
  }

  reverse(result.begin(), result.end()); // 反转得到正确顺序
  cout << result << endl;

  return 0;
}